package projeto.model.testes;

import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import projeto.model.Estabelecimento;
import projeto.model.LeituraDeDados;
import projeto.model.Recomenda;
import projeto.model.RecomendaPopularidade;
import projeto.model.Usuario;

public class RecomendaPopularidadeTest {
	
	private Recomenda Popularidade;
	private Usuario user1,user2;
	private Integer[] opinioes1 = {4,2,0,0,5,1,1,1,-1,2,-4,2,0,-5,-2,4,0,0,3,3,-2,0,0,0,4,3,0,0,0,0,-1,0,0,0,2,0,0,0,2};
	private List<Integer> listaOpinioes1 = Arrays.asList(opinioes1);
	private Integer[] opinioes2 = {3,0,0,0,0,0,0,0,2,3,2,0,0,1,0,4,0,0,0,5,0,0,0,0,0,0,0,0,1,2,0,0,0,2,0,0,3,0,0};
	private List<Integer> listaOpinioes2 = Arrays.asList(opinioes2);
	private List<Estabelecimento> estabs = LeituraDeDados.lerEstabelecimentos("lista_estabelecimentos_projeto_lp2-v2.data");
	private List<Usuario> usuarios;
	private List<Integer> popularidade;
	
	@Before
	public void criaArquivos()throws Exception {
		popularidade = Arrays.asList(8,8,7,5,5,4,3,3,3,2,2,2,2,2,2,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-2,-2,-2,-4);
		user1 = new Usuario("13/05/2011 18:35:48","Nazareno",listaOpinioes1);
		user2 = new Usuario("13/05/2011 18:46:59","Joao",listaOpinioes2);
		usuarios = new ArrayList<Usuario>();
		usuarios.add(user1);
		usuarios.add(user2);
		criaArquivoTeste("ArquivoDeUsuarioValido.data",usuarios);
		usuarios = LeituraDeDados.lerUsuarios("ArquivoDeUsuarioValido.data");
		Popularidade = RecomendaPopularidade.getInstance();
		
	}

	@Test
	public void testGetRecomendacao() {		
		int qtdRec = 12;
		popularidade = popularidade.subList(0, qtdRec);
		
		List<Estabelecimento> popularidadeQtdRecs = Popularidade.getRecomendacao(estabs, usuarios,null,qtdRec);
		
		Assert.assertTrue("Erro em OrdenaPorPopularidadeInt tamanho errado.",qtdRec == popularidadeQtdRecs.size());
		
		for(int i= 0; i< popularidade.size(); i++){
			Assert.assertTrue("Erro OrdenaPorPopularidade popularidade diferente", popularidade.get(i) == popularidadeQtdRecs.get(i).getPopularidade());
		}		
	}

	@Test
	public void testGetInstance() {
		
		Recomenda otherInstance = RecomendaPopularidade.getInstance();
		Assert.assertTrue("Erro RecomendaPopularidade getInstance, instancias diferentes",otherInstance.equals(Popularidade));
		
	}

	
	private void criaArquivoTeste(String fileName, List<Usuario> users){
		PrintWriter outputStream = null;
		String linhaInicial = "Indicação de data e hora;Seu nome;Bar do Cuscuz e Restaurante;Baixinho Bar e Restaurante;Bar do George;Bar do Santos;Bodão Bar e Restaurante;Bonaparte;Bongustaio;Cabana do Possidônio;Cantina da Sayonara;Cantina de Dona Inês;Cantina de Olavo;Cantina do Departamento de Meteorologia;Cantina do Hall das Placas;Cantinho Universitário;Chinatown;Divino Fogão;Fazenda;Giraffas;Girassol;Gulas;Manoel da carne de sol;Marmitaria ArtCulinária;Marmitaria Bom paladar;Marmitaria da Mama;Paladar;Pedro da Picanha;Qdoca Bar e Restaurante;Restaurante Brasília;Restaurante da Quadra;Restaurante do Alexandre;Restaurante do Paraná;Restaurante Golden in China;Restaurante Lay China;Riso;Spolleto;Super China Restaurante;Trailer do Marcus;Tuxá;Varandas Bar e Restaurante";
		
		try{
			outputStream = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName),"UTF-8")));
			if(users != null){
				outputStream.println(linhaInicial);
				for(Usuario u: users){
					outputStream.println(u.toString());
				}				
			}
			
		}catch(FileNotFoundException e2){

		}catch(IOException e){
		}
		finally{
			if (outputStream != null) {
	            outputStream.close();
	         }
		}
	}
	
}